﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SistemaBastanteo.Dominio;
using System.Data.SqlClient;

namespace SistemaBastanteo.Persistencia.ADO
{
    public class BastanteoDAO : IBastanteoDAO
    {

        private Persistencia.NH.ClienteDAO clienteDAO = new Persistencia.NH.ClienteDAO();
        private Persistencia.NH.PoderDAO poderDAO = new Persistencia.NH.PoderDAO();

        public Bastanteo Generar(Bastanteo bastanteo, ICollection<Combinacion> combinacion)
        {
            string sentencia = "INSERT INTO t_bastanteo (cliente, grupo_bastanteo, poder, tipo_intervencion, importe, fecha_vencimiento) VALUES (@cliente, @grupo, @poder, @intervencion, @importe, @fecha_vencimiento)";
            SqlTransaction transaccion;
            using (SqlConnection conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conexion.Open();
                transaccion = conexion.BeginTransaction();

                try
                {

                    if (combinacion != null)
                    {
                        string sentencia2 = "INSERT INTO t_combinacion (cliente, grupo_bastanteo, poder, grupo_conjunto) VALUES (@cliente, @grupo, @poder, @grupo_conjunto)";

                        foreach (Combinacion item in combinacion)
                        {
                            using (SqlCommand comando2 = new SqlCommand(sentencia2, conexion, transaccion))
                            {
                                comando2.Parameters.Add(new SqlParameter("@cliente", bastanteo.Cliente.Codigo ));
                                comando2.Parameters.Add(new SqlParameter("@grupo", bastanteo.Grupo ));
                                comando2.Parameters.Add(new SqlParameter("@poder", bastanteo.Poder.Codigo ));
                                comando2.Parameters.Add(new SqlParameter("@grupo_conjunto", item.GrupoConjunto));
                                comando2.ExecuteNonQuery();
                            }

                        }
                    }

                    using (SqlCommand comando = new SqlCommand(sentencia, conexion, transaccion))
                    {
                        comando.Parameters.Add(new SqlParameter("@cliente", bastanteo.Cliente.Codigo));
                        comando.Parameters.Add(new SqlParameter("@grupo", bastanteo.Grupo));
                        comando.Parameters.Add(new SqlParameter("@poder", bastanteo.Poder.Codigo));
                        comando.Parameters.Add(new SqlParameter("@intervencion", bastanteo.TipoIntervencion));
                        comando.Parameters.Add(new SqlParameter("@importe", bastanteo.Importe));
                        comando.Parameters.Add(new SqlParameter("@fecha_vencimiento", bastanteo.FechaLimite));
                        comando.ExecuteNonQuery();
                    }

                    transaccion.Commit();
                }
                catch (SqlException error)
                {
                    transaccion.Rollback();
                    throw new Exception(error.Message);
                }
            }
            return ObtenerBastanteo(bastanteo.Cliente.Codigo, bastanteo.Grupo, bastanteo.Poder.Codigo );
        }
        public Bastanteo ObtenerBastanteo(int cliente, string grupo, int poder)
        {
            Bastanteo bastanteoExistente = null;
            string sentencia = "SELECT cliente, grupo_bastanteo, poder, tipo_intervencion, importe, fecha_vencimiento " +
                                "FROM t_bastanteo " +
                                "WHERE cliente=@cliente AND grupo_bastanteo=@grupo AND poder=@poder";

            using (SqlConnection conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@cliente", cliente));
                    comando.Parameters.Add(new SqlParameter("@grupo", grupo));
                    comando.Parameters.Add(new SqlParameter("@poder", poder));

                    SqlDataReader resultado = comando.ExecuteReader();
                    if (resultado.Read())
                    {
                        bastanteoExistente = new Bastanteo();
                        bastanteoExistente.Cliente = clienteDAO.Obtener((int)resultado["cliente"]);
                        bastanteoExistente.Grupo = (string)resultado["grupo_bastanteo"];
                        bastanteoExistente.Poder = poderDAO.Obtener((int)resultado["poder"]);
                        bastanteoExistente.TipoIntervencion = (string)resultado["tipo_intervencion"];
                        bastanteoExistente.Importe = (decimal)resultado["importe"];
                        bastanteoExistente.FechaLimite = (DateTime)resultado["fecha_vencimiento"];
                    }
                }
            }
            return bastanteoExistente;
        }

        public ICollection<Bastanteo> ListarTodos()
        {
            ICollection<Bastanteo> bastanteosExistentes = new List<Bastanteo>();
            Bastanteo bastanteoExistente = null;
            string sentencia = "SELECT * FROM t_bastanteo";
            using (SqlConnection conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    SqlDataReader resultado = comando.ExecuteReader();
                    while (resultado.Read())
                    {
                        bastanteoExistente = new Bastanteo();
                        bastanteoExistente.Cliente = clienteDAO.Obtener((int)resultado["cliente"]);
                        bastanteoExistente.Grupo = (string)resultado["grupo_bastanteo"];
                        bastanteoExistente.Poder = poderDAO.Obtener((int)resultado["poder"]);
                        bastanteoExistente.TipoIntervencion = (string)resultado["tipo_intervencion"];
                        bastanteoExistente.Importe = (decimal)resultado["importe"];
                        bastanteoExistente.FechaLimite = (DateTime)resultado["fecha_vencimiento"];
                        bastanteosExistentes.Add(bastanteoExistente);
                    }
                }
            }
            return bastanteosExistentes;

        }
        public ICollection<Combinacion> ObtenerCombinaciones(int cliente, string grupo, int poder)
        {
            ICollection<Combinacion> combinacionesExistentes = new List<Combinacion>();
            Combinacion combinacionExistente = null;
            string sentencia = "SELECT * " +
                                "FROM t_combinacion " +
                                "WHERE cliente=@cliente AND grupo_bastanteo=@grupo AND poder=@poder";

            using (SqlConnection conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@cliente", cliente));
                    comando.Parameters.Add(new SqlParameter("@grupo", grupo));
                    comando.Parameters.Add(new SqlParameter("@poder", poder));

                    SqlDataReader resultado = comando.ExecuteReader();
                    while (resultado.Read())
                    {
                        combinacionExistente = new Combinacion();
                        combinacionExistente.Cliente = clienteDAO.Obtener((int)resultado["cliente"]);
                        combinacionExistente.Grupo = ObtenerBastanteo((int)resultado["cliente"], (string)resultado["grupo_bastanteo"], (int)resultado["poder"]);
                        combinacionExistente.Poder = poderDAO.Obtener((int)resultado["poder"]);
                        combinacionExistente.GrupoConjunto = (string)resultado["poder"];
                        combinacionesExistentes.Add(combinacionExistente);
                    }
                }

                return combinacionesExistentes;

            }
        }
        public void Eliminar(Bastanteo bastanteo)
        {
            string sentenciaB = "DELETE FROM t_bastanteo   WHERE cliente=@cliente AND grupo_bastanteo=@grupo AND poder=@poder";
            string sentenciaC = "DELETE FROM t_combinacion WHERE cliente=@cliente AND grupo_bastanteo=@grupo AND poder=@poder";
            using (SqlConnection conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentenciaC, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@cliente", bastanteo.Cliente.Codigo));
                    comando.Parameters.Add(new SqlParameter("@grupo", bastanteo.Grupo));
                    comando.Parameters.Add(new SqlParameter("@poder", bastanteo.Poder.Codigo));
                    comando.ExecuteNonQuery();
                }
                using (SqlCommand comando = new SqlCommand(sentenciaB, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@cliente", bastanteo.Cliente.Codigo));
                    comando.Parameters.Add(new SqlParameter("@grupo", bastanteo.Grupo));
                    comando.Parameters.Add(new SqlParameter("@poder", bastanteo.Poder.Codigo));

                    comando.ExecuteNonQuery();
                }
            }
        }

        public Bastanteo VerificarPoderes(string ruc, int representante, int poder)
        {
           
            Bastanteo bastanteo = null;

            string sentencia = "SELECT b.cliente, b.grupo_bastanteo, b.poder, b.tipo_intervencion, b.importe, b.fecha_vencimiento "+
                                "FROM t_representante r  INNER JOIN t_bastanteo b " + 
                                "ON r.cliente=b.cliente AND r.grupo_bastanteo=b.grupo_bastanteo "+
                                "INNER JOIN t_cliente c ON b.cliente = c.codigo " +
                                "WHERE 	ruc = @ruc AND r.codigo = @representante AND poder=@poder";

            using (SqlConnection conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@ruc", ruc));
                    comando.Parameters.Add(new SqlParameter("@representante", representante));
                    comando.Parameters.Add(new SqlParameter("@poder", poder));


                    SqlDataReader resultado = comando.ExecuteReader();
                    if (resultado.Read())
                    {
                        bastanteo = new Bastanteo();
                        bastanteo.Cliente = clienteDAO.Obtener((int)resultado["cliente"]);
                        bastanteo.Grupo = (string)resultado["grupo_bastanteo"];
                        bastanteo.Poder = poderDAO.Obtener((int)resultado["poder"]);
                        bastanteo.TipoIntervencion = (string)resultado["tipo_intervencion"];
                        bastanteo.Importe = (decimal)resultado["importe"];
                        bastanteo.FechaLimite = (DateTime)resultado["fecha_vencimiento"];
                        
                    }
                }

                return bastanteo;

            }
        }

        public ICollection<Bastanteo> ConsultaPoderesGrupo(string ruc, int representante, string grupo)
        {
            ICollection<Bastanteo> listaBastanteo = new List<Bastanteo>();
            Bastanteo bastanteo = null;

            string sentencia = "SELECT b.cliente, b.grupo_bastanteo, b.poder, b.tipo_intervencion, b.importe, b.fecha_vencimiento " +
                                "FROM t_representante r  INNER JOIN t_bastanteo b " +
                                "ON r.cliente=b.cliente AND r.grupo_bastanteo=b.grupo_bastanteo " +
                                "INNER JOIN t_cliente c ON b.cliente = c.codigo " +
                                "WHERE ruc = @ruc AND r.codigo = @representante AND b.grupo_bastanteo = @grupo";

            using (SqlConnection conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@ruc", ruc));
                    comando.Parameters.Add(new SqlParameter("@representante", representante));
                    comando.Parameters.Add(new SqlParameter("@grupo", grupo));


                    SqlDataReader resultado = comando.ExecuteReader();
                    while (resultado.Read())
                    {
                        bastanteo = new Bastanteo();
                        bastanteo.Cliente = clienteDAO.Obtener((int)resultado["cliente"]);
                        bastanteo.Grupo = (string)resultado["grupo_bastanteo"];
                        bastanteo.Poder = poderDAO.Obtener((int)resultado["poder"]);
                        bastanteo.TipoIntervencion = (string)resultado["tipo_intervencion"];
                        bastanteo.Importe = (decimal)resultado["importe"];
                        bastanteo.FechaLimite = (DateTime)resultado["fecha_vencimiento"];
                        listaBastanteo.Add(bastanteo);
                    }
                }

            }
            return listaBastanteo;
            
        }

        public ICollection<Bastanteo> ConsultaPoderesTipo(string ruc, int representante, string tipo_intervencion)
        {
            ICollection<Bastanteo> listaBastanteo = new List<Bastanteo>();
            Bastanteo bastanteo = null;

            string sentencia = "SELECT b.cliente, b.grupo_bastanteo, b.poder, b.tipo_intervencion, b.importe, b.fecha_vencimiento " +
                                "FROM t_representante r  INNER JOIN t_bastanteo b " +
                                "ON r.cliente=b.cliente AND r.grupo_bastanteo=b.grupo_bastanteo " +
                                "INNER JOIN t_cliente c ON b.cliente = c.codigo " +
                                "WHERE ruc = @ruc AND r.codigo = @representante AND b.tipo_intervencion = @tipo";

            using (SqlConnection conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@ruc", ruc));
                    comando.Parameters.Add(new SqlParameter("@representante", representante));
                    comando.Parameters.Add(new SqlParameter("@tipo", tipo_intervencion));


                    SqlDataReader resultado = comando.ExecuteReader();
                    while (resultado.Read())
                    {
                        bastanteo = new Bastanteo();
                        bastanteo.Cliente = clienteDAO.Obtener((int)resultado["cliente"]);
                        bastanteo.Grupo = (string)resultado["grupo_bastanteo"];
                        bastanteo.Poder = poderDAO.Obtener((int)resultado["poder"]);
                        bastanteo.TipoIntervencion = (string)resultado["tipo_intervencion"];
                        bastanteo.Importe = (decimal)resultado["importe"];
                        bastanteo.FechaLimite = (DateTime)resultado["fecha_vencimiento"];
                        listaBastanteo.Add(bastanteo);
                    }
                }

            }
            return listaBastanteo;
            
        }

        public Array ListarGrupos(int cliente) {

            Array grupos = Array.CreateInstance(typeof(string), 50);
            string sentencia = "Select DISTINCT grupo_bastanteo From t_representante "+
                                "WHERE cliente = @Cliente ";

            using (SqlConnection conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@cliente", cliente));
                    int index = 0;
                    SqlDataReader resultado = comando.ExecuteReader();
                    while (resultado.Read())
                    {
                        String grupo = (string)resultado["grupo_bastanteo"];
                        grupos.SetValue(grupo, index);
                        index++;
                    }
                }

                return grupos;

            }

        
        }
    }
}
